package edu.berkeley.nlp.lm.map; import java.util.Iterator; import java.util.List; import java.util.Map.Entry; import edu.berkeley.nlp.lm.WordIndexer; import edu.berkeley.nlp.lm.collections.Iterators; /** * Wraps an NgramMap as an Iterable, so it is easy to iterate over the n-grams * of a particular order. Using this interface is a little inefficient due to * the boxing and temporary object allocation necessary to conform to Java's * interfaces. * * @author adampauls * * @param <V> * @param <W> */ public class NgramsForOrderIterableWrapper<W, V> implements Iterable<java.util.Map.Entry<List<W>, V>> { private final NgramMap<V> map; private final int ngramOrder; private final WordIndexer<W> wordIndexer; /** * * @param map * @param ngramOrder * 0-based, i.e. 0 means unigrams */ public NgramsForOrderIterableWrapper(final NgramMap<V> map, final WordIndexer<W> wordIndexer, final int ngramOrder) { this.map = map; this.ngramOrder = ngramOrder; this.wordIndexer = wordIndexer; } @Override public Iterator<Entry<List<W>, V>> iterator() { return new Iterators.Transform<NgramMap.Entry<V>, java.util.Map.Entry<List<W>, V>>(map.getNgramsForOrder(ngramOrder).iterator()) { @Override protected Entry<List<W>, V> transform(final edu.berkeley.nlp.lm.map.NgramMap.Entry<V> next) { return new java.util.Map.Entry<List<W>, V>() { @Override public List<W> getKey() { final List<W> ngram = WordIndexer.StaticMethods.toList(wordIndexer, next.key); return ngram; } @Override public V getValue() { return next.value; } @Override public V setValue(final V arg0) { throw new UnsupportedOperationException("Method not yet implemented"); } }; } }; } public long size() { return map.getNumNgrams(ngramOrder); } }